﻿/*+========================================================
File:		GameObject.h
Sumary:	Định nghĩa lớp GameObject tổng quát
========================================================+*/

#pragma once

#include "ResourcesManager.h"
#include "Viewport.h"
#include "Sprite.h"
#include "Input.h"
#include "Collision.h"
#include <vector>

/*C+==================================================================
Class:    CGameObject

Summary:  Lớp CGameObject là lớp đối tượng game, chứa các thuộc tính 
	và phương thức cần thiết để xây dựng một đối tượng game
==================================================================-C*/

class CGameObject
{
public:
	/*M+==================================================================
	Method:	    CGameObject::CGameObject

	Summary:	Phương thức khởi tạo
	==================================================================-M*/
	CGameObject();

	/*M+==================================================================
	Method:	    CGameObject::CGameObject

	Summary:	Phương thức khởi tạo có tham số

	Params:		pos - Vị trí của Object
				id - ID của object
				typeID - ID của loại object
	==================================================================-M*/
	CGameObject(D3DXVECTOR2 pos, int id, int typeID, int val1 = 0, int val2 = 0);

	/*M+==================================================================
	Method:	    CGameObject::~CGameObject

	Summary:	Phương thức hủy
	==================================================================-M*/
	virtual ~CGameObject();

	/*M+==================================================================
	Method:	    CGameObject::Update

	Summary:	Phương thức cập nhật

	Params:		deltaTime - Thời gian chuyển Frame
	==================================================================-M*/
	virtual void Update(float timeFrame);

	/*M+==================================================================
	Method:	    CGameObject::Draw

	Summary:	Phương thức vẽ

	Params:		pViewport - con trỏ đối tượng CViewport để vẽ theo camera
	==================================================================-M*/
	virtual void Draw();

	/*M+==================================================================
	Method:	    CGameObject::IsLive

	Summary:	Phương thức kiểm tra đối tượng có còn sống không
	==================================================================-M*/
	bool IsLive();

	/*M+==================================================================
	Method:	    CGameObject::Kill

	Summary:	Phương thức set cờ IsLive thành false
	==================================================================-M*/
	virtual bool Kill();

	/*M+==================================================================
	Method:	    CGameObject::GetBox

	Summary:	Phương thức lấy ra box của đối tượng để xét va chạm
	==================================================================-M*/
	Box GetBox();

	/*M+==================================================================
	Method:	    CGameObject::Kill

	Summary:	Phương thức set cờ IsLive thành false
	==================================================================-M*/
	virtual bool IsMoveableObject();

	/*M+==================================================================
	Method:	    CGameObject::Kill

	Summary:	Phương thức gán box bound cho object
	==================================================================-M*/
	void SetBoundBox(Box boundBox);

	int GetId()
	{
		return this->m_nId;
	}

	int GetTypeId();

	D3DXVECTOR2 GetPos();

	friend class CPlayState;
protected:
	// ID của đối tượng game
	int m_nId;

	// Vị trí của đối tượng game (vị trí trung tâm)
	D3DXVECTOR2 m_pos;

	// Con trỏ Sprite của đối tượng game
	CSprite* m_pSprite;

	// ID của loại đối tượng game
	int m_nTypeId;

	// Đối tượng game còn sống hay không
	bool m_bIsLive;

	// Box bao đối tượng xét va chạm
	Box m_box;

	//Đối tượng quản lý tài nguyên
	static CResourcesManager* m_pResourceManager;

	//Các thông tin bổ sung của đối tượng
	int m_nValue1;
	int m_nValue2;

	//ID box của đối tượng game
	int m_nBoxId;

};

/*C+==================================================================
Class:    CStaticObject

Summary:  Lớp CStaticObject kế thừa từ CGameObject, chứa các thuộc tính
 và phương thức của một đối tượng tĩnh
==================================================================-C*/
class CStaticObject : public CGameObject
{
private:
	CTexture* m_pTextureBox;
public:
	/*M+==================================================================
	Method:	    CStaticObject::CStaticObject

	Summary:	Phương thức khởi tạo

	Params:		pos - Vị trí của đối tượng
				id  - ID của đối tượng
				typeID - ID của loại đối tượng
	==================================================================-M*/
	CStaticObject(D3DXVECTOR2 pos, int id, int typeID);

	/*M+==================================================================
	Method:	    CStaticObject::~CStaticObject

	Summary:	Phương thức hủy
	==================================================================-M*/
	virtual ~CStaticObject();

	/*M+==================================================================
	Method:	    CStaticObject::Update

	Summary:	Phương thức cập nhật đối tượng game

	Params:		timeFrame	-	thời gian frame
	==================================================================-M*/
	virtual void Update(float timeFrame);

	void Draw();
};

/*C+==================================================================
Class:    CMoveableObject

Summary:  Lớp CMoveableObject kế thừa từ CGameObject, chứa các thuộc tính
và phương thức của một đối tượng động
==================================================================-C*/

class CMoveableObject : public CGameObject
{
protected:
	//Vận tốc di chuyển của đối tượng
	D3DXVECTOR2 m_v;
	//Gia tốc di chuyển của đối tượng
	D3DXVECTOR2 m_a;
	// Máu của đối tượng.
	int m_nLife;

	float CheckCollision(CGameObject* obj, float& normalx, float& normaly, float timeFrame);
public:
	/*M+==================================================================
	Method:	    CMoveableObject::CMoveableObject

	Summary:	Phương thức khởi tạo

	Params:		pos - Vị trí của đối tượng
	id  - ID của đối tượng
	typeID - ID của loại đối tượng
	==================================================================-M*/
	CMoveableObject(D3DXVECTOR2 pos, int id, int typeID, int val1 = 0, int val2 = 0);

	/*M+==================================================================
	Method:	    CMoveableObject::CMoveableObject

	Summary:	Phương thức hủy
	==================================================================-M*/
	virtual ~CMoveableObject();

	/*M+==================================================================
	Method:	    CMoveableObject::Update

	Summary:	Phương thức cập nhật đối tượng game

	Params:		timeFrame - Thời gian chuyển frame
	==================================================================-M*/
	virtual void Update(float timeFrame);

	/*M+==================================================================
	Method:	    CMoveableObject::UpdateBox

	Summary:	Phương thức cập nhật box cho đối tượng

	Params:		timeFrame - Thời gian chuyển frame
	==================================================================-M*/
	virtual void UpdateBox(float timeFrame);

	/*M+==================================================================
	Method:	    CMoveableObject::UpdateCollision

	Summary:	Phương thức cập nhật va chạm game
	==================================================================-M*/
	virtual void UpdateCollision(vector<CGameObject*> vecGameObjs, float timeFrame);

	/*M+==================================================================
	Method:	    CMoveableObject::CMoveableObject

	Summary:	Phương thức trả về tốc độ của đối tượng

	Params:		timeFrame - Thời gian chuyển frame
	==================================================================-M*/
	D3DXVECTOR2 GetVelocity();

	bool IsMoveableObject();

	friend class CPlayState;
};

/*C+==================================================================
Class:    CTileObject

Summary:  Lớp CTileObject kế thừa từ CGameObject, chứa các thuộc tính
và phương thức của một đối tượng tile
==================================================================-C*/
class CTileObject: public CGameObject
{
public:
	/*M+==================================================================
	Method:	    CTileObject::CTileObject

	Summary:	Phương thức khởi tạo

	Params:		pos - Vị trí của đối tượng
				id  - ID của đối tượng
				typeID - ID của loại đối tượng
				r - RECT nguồn của tile
	==================================================================-M*/
	CTileObject(D3DXVECTOR2 pos, int id, int typeID, RECT r, int level);

	/*M+==================================================================
	Method:	    CTileObject::CTileObject

	Summary:	Phương thức hủy
	==================================================================-M*/
	~CTileObject();

	/*M+==================================================================
	Method:	    CTileObject::CTileObject

	Summary:	Phương thức cập nhật
	==================================================================-M*/
	void Update(float timeFrame);

	/*M+==================================================================
	Method:	    CTileObject::CTileObject

	Summary:	Phương thức vẽ
	==================================================================-M*/
	void Draw();
private:
	CTexture* m_pTexture;
	RECT m_SrcRect;
};